---
title: SAIF.Business.Claim business rules
summary: Enumerated business rules with per-rule trigger, enforcement, and outcomes.
status: draft
owner: SAIF Documentation Generator
last_reviewed: 2026-08-21
library: SAIF.Business.Claim
reference_type: embedded
---

# SAIF.Business.Claim business rules

This page captures business rules enforced by this library.

## BR-001 1502 transfer claim ID required

| Field | Value |
| --- | --- |
| **Statement** | The claim ID on a DCBS 1502 transfer record must be non-zero ("Error: The claim id is invalid."). |
| **Trigger** | Rule check on the 1502 transfer object; fails when `ClaimID = 0`. |
| **Enforcement** | `ValidClaimID` (`RuleData` attribute) in `cls1502Transfer.vb`. |
| **Outcome** | Broken rule; save is blocked. |
| **Tables** | [CL_1502_DCBS_TRANSFER](database-tables.md#cl_1502_dcbs_transfer) |
| **SQL** | [SQL-001](sql/SQL-001.md), [SQL-004](sql/SQL-004.md) |
| **Source** | SAIF.Business.Claim/cls1502Transfer.vb |

---

## BR-002 1502 transfer filing reason required

| Field | Value |
| --- | --- |
| **Statement** | A filing reason code is required on a DCBS 1502 transfer record ("Error: The Filing Reason is required."). |
| **Trigger** | Rule check when `FilingReasonCode.Any` is not satisfied. |
| **Enforcement** | `ValidFilingReason` (`RuleData` attribute) in `cls1502Transfer.vb`. |
| **Outcome** | Broken rule; save is blocked. The rule ID (`cls1502Transfer01`) is duplicated with `ValidClaimID`, which is a defect.* |
| **Tables** | [CL_1502_DCBS_TRANSFER](database-tables.md#cl_1502_dcbs_transfer) |
| **SQL** | [SQL-004](sql/SQL-004.md) |
| **Source** | SAIF.Business.Claim/cls1502Transfer.vb |

---

## BR-003 Work status date cannot be in the future

| Field | Value |
| --- | --- |
| **Statement** | The date the worker returned to work is invalid if it is later than the current date ("Error: The date the worker returned to work is invalid."). |
| **Trigger** | `WorkStatusDate` is later than `Now`. |
| **Enforcement** | `ValidWorkStatusDate` in `clsClaimWorkStatus.vb`. |
| **Outcome** | Broken rule; save is blocked. |
| **Tables** | [CL_CLAIM_WORK_STATUS](database-tables.md#cl_claim_work_status) |
| **SQL** | [SQL-003](sql/SQL-003.md), [SQL-007](sql/SQL-007.md), [SQL-021](sql/SQL-021.md), [SQL-045](sql/SQL-045.md), [SQL-060](sql/SQL-060.md) |
| **Source** | SAIF.Business.Claim/clsClaimWorkStatus.vb |

---

## BR-004 Work release date must be valid at level two

| Field | Value |
| --- | --- |
| **Statement** | The work release date must pass level-two validation ("Error: The work release date is invalid."). |
| **Trigger** | Work-release date validation at `RuleCheckLevel.LevelTwo`. |
| **Enforcement** | `ValidWorkReleaseDate` in `clsClaimWorkReleaseStatus.vb`. |
| **Outcome** | Broken rule at level two; save is blocked. |
| **Tables** | [CL_CLAIM_WORK_RELEASE_STATUS](database-tables.md#cl_claim_work_release_status) |
| **SQL** | [SQL-002](sql/SQL-002.md), [SQL-006](sql/SQL-006.md), [SQL-020](sql/SQL-020.md), [SQL-044](sql/SQL-044.md), [SQL-059](sql/SQL-059.md) |
| **Source** | SAIF.Business.Claim/clsClaimWorkReleaseStatus.vb |

---

## BR-005 Work release status data must be present

| Field | Value |
| --- | --- |
| **Statement** | Work-release status data must be present on the object ("Error: No work release status data available."). |
| **Trigger** | No work-release status data present on the object. |
| **Enforcement** | `HasData` in `clsClaimWorkReleaseStatus.vb`. |
| **Outcome** | Broken rule; save is blocked. |
| **Tables** | [CL_CLAIM_WORK_RELEASE_STATUS](database-tables.md#cl_claim_work_release_status) |
| **SQL** | [SQL-002](sql/SQL-002.md), [SQL-006](sql/SQL-006.md), [SQL-020](sql/SQL-020.md) |
| **Source** | SAIF.Business.Claim/clsClaimWorkReleaseStatus.vb |

---

## BR-006 Primary body part is required

| Field | Value |
| --- | --- |
| **Statement** | A primary body part is required on the injured body-part collection ("Error: Primary body part is required."). |
| **Trigger** | Collection rule check, only evaluated when `Validate` is `True`. |
| **Enforcement** | `PrimaryValid` in `clsWorkerInjuredBodyPartCollection.vb`. |
| **Outcome** | Broken rule; save is blocked. |
| **Tables** | [CL_WORKER_INJURED_BODY_PART](database-tables.md#cl_worker_injured_body_part) |
| **SQL** | [SQL-008](sql/SQL-008.md), [SQL-036](sql/SQL-036.md), [SQL-050](sql/SQL-050.md) |
| **Source** | SAIF.Business.Claim/clsWorkerInjuredBodyPartCollection.vb |

---

## BR-007 Only one primary body part is allowed

| Field | Value |
| --- | --- |
| **Statement** | Only one primary body part is allowed on the injured body-part collection ("Error: Only one primary body part is allowed."). |
| **Trigger** | Collection rule check, always evaluated (deliberately not gated by `Validate`). |
| **Enforcement** | `OnlyOnePrimary` in `clsWorkerInjuredBodyPartCollection.vb`. |
| **Outcome** | Broken rule; save is blocked. |
| **Tables** | [CL_WORKER_INJURED_BODY_PART](database-tables.md#cl_worker_injured_body_part) |
| **SQL** | [SQL-008](sql/SQL-008.md), [SQL-036](sql/SQL-036.md), [SQL-050](sql/SQL-050.md) |
| **Source** | SAIF.Business.Claim/clsWorkerInjuredBodyPartCollection.vb |

---

## BR-008 Claim not found on aggravation-rights retrieve

| Field | Value |
| --- | --- |
| **Statement** | A "Claim Not Found" error is raised when the aggravation-rights stored-procedure retrieve returns no rows. |
| **Trigger** | Stored-procedure retrieve returned no rows. |
| **Enforcement** | `AfterRetrieve` in `clsAggRightDates.vb`; the same identifier (`clsAggRightDates01`) is reused in `clsITimelinessOfFirstPayment.vb`'s `AfterRetrieve`, an ID collision.* |
| **Outcome** | Error message added to the object; caller sees a failed retrieve. |
| **SQL** | [SQL-013](sql/SQL-013.md), [SQL-034](sql/SQL-034.md) |
| **Source** | SAIF.Business.Claim/clsAggRightDates.vb |

---

## BR-009 Benefit schedule update must affect a row

| Field | Value |
| --- | --- |
| **Statement** | A benefit-schedule update that affects zero rows is an error (`#PAYUPD#`). |
| **Trigger** | `UpdateSchedSQL` returned `RowsAffected = 0` during `ProcessBenefitPayment`. |
| **Enforcement** | `clsActiveBenefitSchedule.vb` — `ProcessBenefitPayment`. |
| **Outcome** | Error added; method returns `False`. |
| **Tables** | [CL_BENEFIT_PAYMENT](database-tables.md#cl_benefit_payment) |
| **SQL** | [SQL-039](sql/SQL-039.md) |
| **Source** | SAIF.Business.Claim/clsActiveBenefitSchedule.vb |

---

## BR-010 Benefit payment delete must affect a row

| Field | Value |
| --- | --- |
| **Statement** | A benefit-payment delete that affects zero rows is an error (`#PAYDEL#`). |
| **Trigger** | `DeletePaymentSQL` returned `RowsAffected = 0` during `ProcessBenefitPayment`. |
| **Enforcement** | `clsActiveBenefitSchedule.vb` — `ProcessBenefitPayment`. |
| **Outcome** | Error added; method returns `False`. |
| **Tables** | [CL_BENEFIT_PAYMENT](database-tables.md#cl_benefit_payment) |
| **SQL** | [SQL-054](sql/SQL-054.md) |
| **Source** | SAIF.Business.Claim/clsActiveBenefitSchedule.vb |

---

## BR-011 Award must be successfully updated to pending

| Field | Value |
| --- | --- |
| **Statement** | An award-to-Pending update must succeed ("The Award was NOT succesfully updated to Pending", spelling as in source). |
| **Trigger** | Award-to-Pending update did not succeed. |
| **Enforcement** | `clsSetAwardPaymentPending.vb`. |
| **Outcome** | Error added; operation reported as failed. |
| **Tables** | [CL_AWARD](database-tables.md#cl_award) |
| **SQL** | [SQL-031](sql/SQL-031.md), [SQL-032](sql/SQL-032.md), [SQL-048](sql/SQL-048.md), [SQL-049](sql/SQL-049.md) |
| **Source** | SAIF.Business.Claim/clsSetAwardPaymentPending.vb |

---

## BR-012 Optimistic concurrency contention check

| Field | Value |
| --- | --- |
| **Statement** | Insert, update, and delete operations must affect exactly one row (`RowsAffected <> 1` or `= 0`) or a DB-contention error (`clsConstants.Messages.DBContentionError`) is raised. |
| **Trigger** | `RowsAffected` mismatch after an insert/update/delete against a UPDATE_NUM-versioned row. |
| **Enforcement** | `After*` hooks (`UpdateError` / `InsertError` / `DeleteError`) across the persistent classes. |
| **Outcome** | Optimistic-concurrency failure surfaced to the caller. |
| **SQL** | [SQL-004](sql/SQL-004.md), [SQL-005](sql/SQL-005.md), [SQL-006](sql/SQL-006.md), [SQL-007](sql/SQL-007.md), [SQL-008](sql/SQL-008.md), [SQL-037](sql/SQL-037.md), [SQL-038](sql/SQL-038.md), [SQL-040](sql/SQL-040.md), [SQL-041](sql/SQL-041.md), [SQL-043](sql/SQL-043.md), [SQL-044](sql/SQL-044.md), [SQL-045](sql/SQL-045.md), [SQL-046](sql/SQL-046.md), [SQL-047](sql/SQL-047.md), [SQL-050](sql/SQL-050.md), [SQL-053](sql/SQL-053.md), [SQL-055](sql/SQL-055.md), [SQL-056](sql/SQL-056.md), [SQL-058](sql/SQL-058.md), [SQL-062](sql/SQL-062.md) |
| **Source** | SAIF.Business.Claim/clsActiveBenefitSchedule.vb |

## Stored procedure business rules

Rules sourced from Oracle stored procedures referenced by this library.

| Rule ID | Rule | Source | Link |
| --- | --- | --- | --- |
| PR-BC-001 | An injury date on or before 01-Jan-1900 is not a usable injury date and stops the calculation. | `sp82286_statutoryweeklywage` | [Details](procedures/sp82286-statutoryweeklywage.md#business-rules) |
| PR-BC-002 | Wages at the time of injury must be a positive amount. | `sp82286_statutoryweeklywage` | [Details](procedures/sp82286-statutoryweeklywage.md#business-rules) |
| PR-BC-003 | The pay period must be one of the five recognised codes: `H`, `D`, `W`, `M`, `A`. | `sp82286_statutoryweeklywage` | [Details](procedures/sp82286-statutoryweeklywage.md#business-rules) |
| PR-BC-004 | An hourly wage cannot be annualised without a non-zero hours-worked-per-day value. | `sp82286_statutoryweeklywage` | [Details](procedures/sp82286-statutoryweeklywage.md#business-rules) |
| PR-BC-005 | Hourly and daily wages cannot be converted to a weekly wage without a non-zero days-worked-per-week value. | `sp82286_statutoryweeklywage` | [Details](procedures/sp82286-statutoryweeklywage.md#business-rules) |
| PR-BC-006 | The weeks-per-month conversion factor used for monthly wages depends on the injury date: injuries before 01-Oct-1973 use the historical factor, later injuries use the current factor. | `sp82286_statutoryweeklywage` | [Details](procedures/sp82286-statutoryweeklywage.md#business-rules) |
| PR-BC-007 | For hourly or daily workers injured before the 1995 effective date, the days-worked-per-week used in the calculation is floored at three days, even when the worker actually worked fewer days. | `sp82286_statutoryweeklywage` | [Details](procedures/sp82286-statutoryweeklywage.md#business-rules) |
| PR-BC-008 | The statutory weekly wage is derived from the pay period: hourly = rate × hours/day × days/week; daily = rate × days/week; weekly = the wage as supplied; monthly = wage ÷ weeks-per-month; annual = wage ÷ 52. | `sp82286_statutoryweeklywage` | [Details](procedures/sp82286-statutoryweeklywage.md#business-rules) |
| PR-BC-009 | Every execution path — validation failure or successful calculation — returns exactly one row containing a wage and an error message; failures are reported as data, not as raised exceptions. | `sp82286_statutoryweeklywage` | [Details](procedures/sp82286-statutoryweeklywage.md#business-rules) |

No rules are recorded for `sp82046_CalcAggRightDates`, `sp82067_TimelinessOf1stPayment`, or `sp82289_medicallystationarydt` — these three are `not-found-by-cli` and no procedure body was retrieved for them.

## Notes
- `cls1502Transfer01` is used as the rule ID for two distinct rules (BR-001, BR-002), which is likely a copy/paste defect.*
- `clsAggRightDates01` is reused across `clsAggRightDates.vb` and `clsITimelinessOfFirstPayment.vb`, which is likely a copy/paste defect and could make broken-rule messages ambiguous.**
- Several classes (`clsActiveBenefitSchedule`, `clsAwardBenefitPayment`, `clsFederalAwardStatus`, `clsWorkerInjuredBodyPart`) contain commented-out `Rules.AddRule` templates only; these are not live rules and are excluded from this page.
- SQL-048 (setting an award to Pending) has no `UPDATE_NUM` predicate in its WHERE clause and is therefore not protected by the optimistic-concurrency check described in BR-012.*

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Dependencies](dependencies.md)
- [Operations and processes](operations-processes.md)
- [Database tables](database-tables.md)
- [SQL catalog](sql/index.md)
- [Procedures](procedures/index.md)
- [API reference](api/index.md)

> **Note:** Statements marked with `*` were inferred from code structure, naming
> conventions, or contextual evidence where direct confirmation was not available
> in source artifacts. Statements marked with `**` could not be confirmed; treat
> as unknown until verified.

## Sources
- SAIF.Business.Claim/cls1502Transfer.vb
- SAIF.Business.Claim/clsClaimWorkStatus.vb
- SAIF.Business.Claim/clsClaimWorkReleaseStatus.vb
- SAIF.Business.Claim/clsWorkerInjuredBodyPartCollection.vb
- SAIF.Business.Claim/clsAggRightDates.vb
- SAIF.Business.Claim/clsITimelinessOfFirstPayment.vb
- SAIF.Business.Claim/clsActiveBenefitSchedule.vb
- SAIF.Business.Claim/clsSetAwardPaymentPending.vb
